1863G - Swaps - CodeForces Solution


combinatorics graphs math

Please click on ads to support us..

C++ Code:

#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define pb push_back

const int N = 1e6 + 100;
const ll MOD = 1e9 + 7;

int n, a[N], in[N], bio[N];

inline ll mul(ll x, ll y){
	return (x * y) % MOD;
}

inline ll add(ll x, ll y){
	if (x + y >= MOD) return (x + y - MOD);
	return (x + y);
}

inline ll diff(ll x, ll y){
	if (x < y) return (x - y + MOD);
	return (x - y);
}

int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	
	cin >> n;
	for (int i = 1; i <= n; ++i){
		cin >> a[i]; ++in[a[i]];
	}
	
	vector<int> cycle; int cnt = 1;
	for (int i = 1; i <= n; ++i){
		if (bio[i] > 0) continue;
		int x = i;
		while (bio[x] == 0)
			bio[x] = cnt, x = a[x];
		if (bio[x] == cnt)
			cycle.pb(x);
		++cnt;
	}
	
	ll sol = 1; memset(bio, 0, sizeof(bio));
	for (int x: cycle){
		int y = x, deg_sum = 0;
		ll M = 1;
		while (!bio[y]){
			M = mul(M, in[y] + 1);
			deg_sum += in[y];
			bio[y] = 1; y = a[y];
		}
		sol = mul(sol, diff(M, deg_sum));
	}
	
	for (int i = 1; i <= n; ++i){
		if (!bio[i]) sol = mul(sol, in[i] + 1);
	}
	
	cout << sol;
	
	return 0;
}


Comments

Submit
0 Comments
More Questions

977A - Wrong Subtraction
263A - Beautiful Matrix
180C - Letter
151A - Soft Drinking
1352A - Sum of Round Numbers
281A - Word Capitalization
1646A - Square Counting
266A - Stones on the Table
61A - Ultra-Fast Mathematician
148A - Insomnia cure
1650A - Deletions of Two Adjacent Letters
1512A - Spy Detected
282A - Bit++
69A - Young Physicist
1651A - Playoff
734A - Anton and Danik
1300B - Assigning to Classes
1647A - Madoka and Math Dad
710A - King Moves
1131A - Sea Battle
118A - String Task
236A - Boy or Girl
271A - Beautiful Year
520B - Two Buttons
231A - Team
479C - Exams
1030A - In Search of an Easy Problem
158A - Next Round
71A - Way Too Long Words
160A - Twins